
package se.sll.service.catalogue.offers.api.model;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Generated;
import javax.validation.Valid;
import org.codehaus.jackson.annotate.JsonAnyGetter;
import org.codehaus.jackson.annotate.JsonAnySetter;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonPropertyOrder;
import org.codehaus.jackson.map.annotate.JsonSerialize;


/**
 * Product
 * <p>
 * A single product
 * 
 */
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
    "status",
    "name",
    "displayName",
    "description",
    "creationTime",
    "updateTime",
    "updatedByHsaId",
    "address",
    "contactPreference",
    "validDatePeriod",
    "offeringTime",
    "demographic",
    "requestRequirement",
    "requestComment",
    "bookable",
    "bookableFor",
    "codes"
})
public class Product {

    /**
     * 
     */
    @JsonProperty("status")
    private String status;
    /**
     * 
     */
    @JsonProperty("name")
    private String name;
    /**
     * 
     */
    @JsonProperty("displayName")
    private String displayName;
    /**
     * 
     */
    @JsonProperty("description")
    private String description;
    /**
     * 
     */
    @JsonProperty("creationTime")
    private Date creationTime;
    /**
     * 
     */
    @JsonProperty("updateTime")
    private Date updateTime;
    /**
     * 
     */
    @JsonProperty("updatedByHsaId")
    private String updatedByHsaId;
    /**
     * A street address
     * 
     */
    @JsonProperty("address")
    @Valid
    private Address address;
    /**
     * a collection of contact preferences
     * 
     */
    @JsonProperty("contactPreference")
    @Valid
    private List<ContactPreference> contactPreference = new ArrayList<ContactPreference>();
    /**
     * A Date Period Type
     * 
     */
    @JsonProperty("validDatePeriod")
    @Valid
    private DatePeriod validDatePeriod;
    /**
     * 
     */
    @JsonProperty("offeringTime")
    private String offeringTime;
    /**
     * a collection of generic CV Types
     * 
     */
    @JsonProperty("demographic")
    @Valid
    private List<Type> demographic = new ArrayList<Type>();
    /**
     * 
     */
    @JsonProperty("requestRequirement")
    private String requestRequirement;
    /**
     * 
     */
    @JsonProperty("requestComment")
    private String requestComment;
    /**
     * 
     */
    @JsonProperty("bookable")
    private Boolean bookable;
    /**
     * 
     */
    @JsonProperty("bookableFor")
    private String bookableFor;
    /**
     * a collection of code system codes
     * 
     */
    @JsonProperty("codes")
    @Valid
    private List<Code> codes = new ArrayList<Code>();
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    /**
     * 
     * @return
     *     The status
     */
    @JsonProperty("status")
    public String getStatus() {
        return status;
    }

    /**
     * 
     * @param status
     *     The status
     */
    @JsonProperty("status")
    public void setStatus(String status) {
        this.status = status;
    }

    public Product withStatus(String status) {
        this.status = status;
        return this;
    }

    /**
     * 
     * @return
     *     The name
     */
    @JsonProperty("name")
    public String getName() {
        return name;
    }

    /**
     * 
     * @param name
     *     The name
     */
    @JsonProperty("name")
    public void setName(String name) {
        this.name = name;
    }

    public Product withName(String name) {
        this.name = name;
        return this;
    }

    /**
     * 
     * @return
     *     The displayName
     */
    @JsonProperty("displayName")
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 
     * @param displayName
     *     The displayName
     */
    @JsonProperty("displayName")
    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public Product withDisplayName(String displayName) {
        this.displayName = displayName;
        return this;
    }

    /**
     * 
     * @return
     *     The description
     */
    @JsonProperty("description")
    public String getDescription() {
        return description;
    }

    /**
     * 
     * @param description
     *     The description
     */
    @JsonProperty("description")
    public void setDescription(String description) {
        this.description = description;
    }

    public Product withDescription(String description) {
        this.description = description;
        return this;
    }

    /**
     * 
     * @return
     *     The creationTime
     */
    @JsonProperty("creationTime")
    public Date getCreationTime() {
        return creationTime;
    }

    /**
     * 
     * @param creationTime
     *     The creationTime
     */
    @JsonProperty("creationTime")
    public void setCreationTime(Date creationTime) {
        this.creationTime = creationTime;
    }

    public Product withCreationTime(Date creationTime) {
        this.creationTime = creationTime;
        return this;
    }

    /**
     * 
     * @return
     *     The updateTime
     */
    @JsonProperty("updateTime")
    public Date getUpdateTime() {
        return updateTime;
    }

    /**
     * 
     * @param updateTime
     *     The updateTime
     */
    @JsonProperty("updateTime")
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public Product withUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
        return this;
    }

    /**
     * 
     * @return
     *     The updatedByHsaId
     */
    @JsonProperty("updatedByHsaId")
    public String getUpdatedByHsaId() {
        return updatedByHsaId;
    }

    /**
     * 
     * @param updatedByHsaId
     *     The updatedByHsaId
     */
    @JsonProperty("updatedByHsaId")
    public void setUpdatedByHsaId(String updatedByHsaId) {
        this.updatedByHsaId = updatedByHsaId;
    }

    public Product withUpdatedByHsaId(String updatedByHsaId) {
        this.updatedByHsaId = updatedByHsaId;
        return this;
    }

    /**
     * A street address
     * 
     * @return
     *     The address
     */
    @JsonProperty("address")
    public Address getAddress() {
        return address;
    }

    /**
     * A street address
     * 
     * @param address
     *     The address
     */
    @JsonProperty("address")
    public void setAddress(Address address) {
        this.address = address;
    }

    public Product withAddress(Address address) {
        this.address = address;
        return this;
    }

    /**
     * a collection of contact preferences
     * 
     * @return
     *     The contactPreference
     */
    @JsonProperty("contactPreference")
    public List<ContactPreference> getContactPreference() {
        return contactPreference;
    }

    /**
     * a collection of contact preferences
     * 
     * @param contactPreference
     *     The contactPreference
     */
    @JsonProperty("contactPreference")
    public void setContactPreference(List<ContactPreference> contactPreference) {
        this.contactPreference = contactPreference;
    }

    public Product withContactPreference(List<ContactPreference> contactPreference) {
        this.contactPreference = contactPreference;
        return this;
    }

    /**
     * A Date Period Type
     * 
     * @return
     *     The validDatePeriod
     */
    @JsonProperty("validDatePeriod")
    public DatePeriod getValidDatePeriod() {
        return validDatePeriod;
    }

    /**
     * A Date Period Type
     * 
     * @param validDatePeriod
     *     The validDatePeriod
     */
    @JsonProperty("validDatePeriod")
    public void setValidDatePeriod(DatePeriod validDatePeriod) {
        this.validDatePeriod = validDatePeriod;
    }

    public Product withValidDatePeriod(DatePeriod validDatePeriod) {
        this.validDatePeriod = validDatePeriod;
        return this;
    }

    /**
     * 
     * @return
     *     The offeringTime
     */
    @JsonProperty("offeringTime")
    public String getOfferingTime() {
        return offeringTime;
    }

    /**
     * 
     * @param offeringTime
     *     The offeringTime
     */
    @JsonProperty("offeringTime")
    public void setOfferingTime(String offeringTime) {
        this.offeringTime = offeringTime;
    }

    public Product withOfferingTime(String offeringTime) {
        this.offeringTime = offeringTime;
        return this;
    }

    /**
     * a collection of generic CV Types
     * 
     * @return
     *     The demographic
     */
    @JsonProperty("demographic")
    public List<Type> getDemographic() {
        return demographic;
    }

    /**
     * a collection of generic CV Types
     * 
     * @param demographic
     *     The demographic
     */
    @JsonProperty("demographic")
    public void setDemographic(List<Type> demographic) {
        this.demographic = demographic;
    }

    public Product withDemographic(List<Type> demographic) {
        this.demographic = demographic;
        return this;
    }

    /**
     * 
     * @return
     *     The requestRequirement
     */
    @JsonProperty("requestRequirement")
    public String getRequestRequirement() {
        return requestRequirement;
    }

    /**
     * 
     * @param requestRequirement
     *     The requestRequirement
     */
    @JsonProperty("requestRequirement")
    public void setRequestRequirement(String requestRequirement) {
        this.requestRequirement = requestRequirement;
    }

    public Product withRequestRequirement(String requestRequirement) {
        this.requestRequirement = requestRequirement;
        return this;
    }

    /**
     * 
     * @return
     *     The requestComment
     */
    @JsonProperty("requestComment")
    public String getRequestComment() {
        return requestComment;
    }

    /**
     * 
     * @param requestComment
     *     The requestComment
     */
    @JsonProperty("requestComment")
    public void setRequestComment(String requestComment) {
        this.requestComment = requestComment;
    }

    public Product withRequestComment(String requestComment) {
        this.requestComment = requestComment;
        return this;
    }

    /**
     * 
     * @return
     *     The bookable
     */
    @JsonProperty("bookable")
    public Boolean getBookable() {
        return bookable;
    }

    /**
     * 
     * @param bookable
     *     The bookable
     */
    @JsonProperty("bookable")
    public void setBookable(Boolean bookable) {
        this.bookable = bookable;
    }

    public Product withBookable(Boolean bookable) {
        this.bookable = bookable;
        return this;
    }

    /**
     * 
     * @return
     *     The bookableFor
     */
    @JsonProperty("bookableFor")
    public String getBookableFor() {
        return bookableFor;
    }

    /**
     * 
     * @param bookableFor
     *     The bookableFor
     */
    @JsonProperty("bookableFor")
    public void setBookableFor(String bookableFor) {
        this.bookableFor = bookableFor;
    }

    public Product withBookableFor(String bookableFor) {
        this.bookableFor = bookableFor;
        return this;
    }

    /**
     * a collection of code system codes
     * 
     * @return
     *     The codes
     */
    @JsonProperty("codes")
    public List<Code> getCodes() {
        return codes;
    }

    /**
     * a collection of code system codes
     * 
     * @param codes
     *     The codes
     */
    @JsonProperty("codes")
    public void setCodes(List<Code> codes) {
        this.codes = codes;
    }

    public Product withCodes(List<Code> codes) {
        this.codes = codes;
        return this;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

    public Product withAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
        return this;
    }

}
